/*
 * GenericKey.h
 *
 *      Author: carlos
 */

#ifndef GENERICKEY_H_
#define GENERICKEY_H_
#include "../../physical_layer/ISerializable.h"
#include <stdio.h>
#include <stdlib.h>
using namespace std;
class GenericKey: public ISerializable {
public:
	GenericKey();
	GenericKey(string realKey);
	GenericKey(Key key);
	GenericKey(ID id);
	GenericKey(int key);

	//constructores de copia
	GenericKey(const GenericKey& genericKey);
	GenericKey(const GenericKey* genericKey);
	virtual ~GenericKey();

	virtual std::string serialize();

	virtual void unserialize(std::string& buffer);

	/*
	 * Cantidad de bytes que ocupará cuando sea serializado.
	 * Es el TOTAL del elemento
	 **/
	virtual int getDataSize() {
		return this->serialize().length();
	}

	friend ostream& operator<<(ostream&, const GenericKey&);

	bool operator==(const GenericKey& k) { // sobrecarga operador ==
		bool isEqual = this->realKey == k.realKey;
		return isEqual;
	}
	bool operator>(const GenericKey& k) { // sobrecarga operador >
		//si al convertirlo en entero da 0 entonces se comprara como caracter si no como numero
		int thisIrealKey = atoi(this->realKey.c_str());
		int irealKey = atoi(k.realKey.c_str());
		if (thisIrealKey == 0 || irealKey == 0) {
			return this->realKey > k.realKey;
		}
		return thisIrealKey > irealKey;
	}
	bool operator<(const GenericKey& k) { // sobrecarga operador <
		//si al convertirlo en entero da 0 entonces se comprara como caracter si no como numero
		int thisIrealKey = atoi(this->realKey.c_str());
		int irealKey = atoi(k.realKey.c_str());
		if (thisIrealKey == 0 || irealKey == 0) {
			return this->realKey < k.realKey;
		}
		return thisIrealKey < irealKey;
	}

	const string& getRealKey() const {
		return realKey;
	}

	void setRealKey(const string& realKey) {
		this->realKey = realKey;
	}

private:
	string realKey;

};

#endif /* GENERICKEY_H_ */
